﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RRHH.Competencias.Entities;
using RRHH.Competencias.Controladores;
using RRHH.Competencias.Entities.AdminPermisos;
using RRHH.Competencias.BusinessLayer;

namespace WebSite.AdministracionPermisos
{
    public partial class Usuarios : System.Web.UI.Page
    {
        protected string codigoPantalla = "USUARIOS";

        protected void Page_Load ( object sender, EventArgs e )
        {
            if (!Page.IsPostBack)
            {
                if (!Master.ValidarAcceso(codigoPantalla)) Response.Redirect("Inicio.aspx");

                ModalPopupExtenderDetalleUsuario.Hide();

                BtnCancelar.Attributes.Add( "onclick", "return confirm('Esta seguro que desea cancelar la operación?')" );
                
                Session["ABMUsuarios.Listado.OrdenarExpresion"] = null;
                Session["ABMUsuarios.Listado.OrdenarDireccion"] = null;

                this.CargarComboSector();

                this.BtnBuscar_Click( null, null );
            }
        }

        protected void CargarComboSector ()
        {
            List<Sector> sectores = new List<Sector>();

            try
            {
                GestorSector gSector = new GestorSector();
                sectores = gSector.BuscarTodos( true );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener el listado de dominios. " + ex.Message );
            }

            DdlSector.Items.Clear();
            DdlSector.Items.Add( new ListItem( "Seleccionar", "-1" ) );

            foreach (Sector sector in sectores)
            {
                DdlSector.Items.Add( new ListItem( sector.Descripcion, sector.Id.ToString() ) );
            }
        }

        private void RegistrarMensajeJavascript ( string nombre, string mensaje )
        {
            mensaje = mensaje.Replace( "'", string.Empty );
            mensaje = mensaje.Replace( "(", string.Empty );
            mensaje = mensaje.Replace( ")", string.Empty );
            mensaje = mensaje.Replace( ",", string.Empty );
            mensaje = mensaje.Replace( ";", string.Empty );
            mensaje = mensaje.Replace( "\"", string.Empty );

            ScriptManager.RegisterStartupScript( this, this.GetType(), nombre, "alert('" + mensaje + "');", true );
        }

        protected void BtnNuevo_Click ( object sender, ImageClickEventArgs e )
        {
            ModalPopupExtenderDetalleUsuario.Show();

            this.LimpiarCamposDetalle();

            BtnAceptar.Visible = true;
            BtnCancelar.Visible = true;
            BtnCerrar.Visible = false;

            TxtNombreUsuario.Enabled = true;
        }

        protected void LimpiarCamposDetalle ()
        {            
            TxtNombreUsuario.Text = string.Empty;
            TxtDescripcion.Text = string.Empty;
            TxtCorreoElectronico.Text = string.Empty;
            DdlSector.SelectedIndex = 0;            
        }

        protected bool Validar ( out string errores )
        {
            errores = string.Empty;
            
            if (string.IsNullOrEmpty( TxtNombreUsuario.Text.Trim() ))
            {
                errores = "Debe indicar un nombre de usuario";
                return false;
            }

            if (string.IsNullOrEmpty( TxtDescripcion.Text.Trim() ))
            {
                errores = "Debe indicar una descripcion";
                return false;
            }

            if (DdlSector.SelectedValue == "0")
            {
                errores = "Debe seleccionar un sector";
                return false;
            }

            if (string.IsNullOrEmpty( TxtContraseña.Text ) || string.IsNullOrEmpty( TxtContraseñaConfirmacion.Text ))
            {
                errores = "Debe ingresar los datos de la contraseña";
                return false;
            }

            //if (!TxtContraseña.Text.Equals( TxtContraseñaConfirmacion.Text ))
            //{
            //    errores = "Los datos de la contraseña no son iguales";
            //    return false;
            //}

            return true;
        }

        protected void BtnCerrar_Click ( object sender, ImageClickEventArgs e )
        {
            ModalPopupExtenderDetalleUsuario.Hide();
            UpdatePanelListado.Update();
        }

        protected void BtnCancelar_Click ( object sender, ImageClickEventArgs e )
        {
            ModalPopupExtenderDetalleUsuario.Hide();
            UpdatePanelListado.Update();
        }

        protected void Buscar ( string nombreUsuario, string descripcionUsuario, bool soloActivos, int pagina )
        {
            GestorUsuario gUsuario = new GestorUsuario();
            List<Usuario> usuarios = gUsuario.Buscar( null, nombreUsuario, descripcionUsuario, soloActivos );

            if (Session["ABMUsuarios.Listado.OrdenarExpresion"] != null)
            {
                usuarios.Sort( new GridViewGenericComparer<Usuario>( Session["ABMUsuarios.Listado.OrdenarExpresion"].ToString(), SortDirection.Ascending ) );
            }

            GrdUsuarios.DataSource = usuarios;
            GrdUsuarios.PageIndex = pagina;

            GrdUsuarios.DataBind();
        }

        protected void GrdUsuarios_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            string buscarNombreUsuario = null;
            string buscarDescripcionUsuario = null;

            if (!string.IsNullOrEmpty( TxtBuscarNombreUsuario.Text.Trim() )) buscarNombreUsuario = TxtBuscarNombreUsuario.Text.Trim();
            if (!string.IsNullOrEmpty( TxtBuscarDescripcion.Text.Trim() )) buscarDescripcionUsuario = TxtBuscarDescripcion.Text.Trim();

            if (string.IsNullOrEmpty( TxtBuscarNombreUsuario.Text.Trim() ) && string.IsNullOrEmpty( TxtBuscarDescripcion.Text.Trim() ))
                

            try
            {
                this.Buscar( buscarNombreUsuario, buscarDescripcionUsuario, !ChkBuscarInactivos.Checked, e.NewPageIndex );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo realizar la búsqueda de Usuarios. " + ex.Message );
            }
        }

        protected void GrdUsuarios_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int indiceFila;
            GestorUsuario gUsuario = new GestorUsuario();

            switch (e.CommandName)
            {
                case "Detalle":
                    indiceFila = Convert.ToInt32( e.CommandArgument );

                    Usuario usuario = new Usuario();
                    usuario.Id = Convert.ToInt64( GrdUsuarios.DataKeys[indiceFila].Values["Id"] );

                    try
                    {
                        usuario = gUsuario.Completar( usuario, false );
                    }
                    catch (Exception ex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la informacion del usuario. " + ex.Message );
                        return;
                    }

                    if (usuario == null)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la informacion del usuario. El usuario indicado no existe" );
                        return;
                    }

                    this.LimpiarCamposDetalle();

                    
                    TxtNombreUsuario.Text = usuario.NombreUsuario;
                    TxtDescripcion.Text = usuario.Descripcion;
                    TxtContraseña.Text = usuario.Contraseña;

                    if (!string.IsNullOrEmpty( usuario.CorreoElectronico )) TxtCorreoElectronico.Text = usuario.CorreoElectronico;

                    if (usuario.Sector != null &&
                        DdlSector.Items.FindByValue( usuario.Sector.Id.ToString() ) != null)
                    {
                        DdlSector.SelectedValue = usuario.Sector.Id.ToString();
                    }
                    
                    BtnAceptar.Visible = false;
                    BtnCancelar.Visible = false;
                    BtnCerrar.Visible = true;
                    TxtNombreUsuario.Enabled = true;

                    ModalPopupExtenderDetalleUsuario.Show();
                    UpdatePanelDetalleUsuarios.Update();

                    break;
                case "Modificar":
                    indiceFila = Convert.ToInt32( e.CommandArgument );

                    usuario = new Usuario();
                    usuario.Id = Convert.ToInt64( GrdUsuarios.DataKeys[indiceFila].Values["Id"] );

                    try
                    {
                        usuario = gUsuario.Completar( usuario, false );
                    }
                    catch (Exception ex)
                    {
                        ScriptManager.RegisterStartupScript( this, this.GetType(), "Error", "alert('No se pudo obtener la informacion del usuario." + ex.Message + "')", true );
                        return;
                    }

                    if (usuario == null)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la informacion del usuario. El usuario indicado no existe" );
                        return;
                    }

                    this.LimpiarCamposDetalle();

                   
                    TxtNombreUsuario.Text = usuario.NombreUsuario;
                    TxtDescripcion.Text = usuario.Descripcion;

                    if (!string.IsNullOrEmpty( usuario.CorreoElectronico )) TxtCorreoElectronico.Text = usuario.CorreoElectronico;

                    if (usuario.Sector != null &&
                        DdlSector.Items.FindByValue( usuario.Sector.Id.ToString() ) != null)
                    {
                        DdlSector.SelectedValue = usuario.Sector.Id.ToString();
                    }
                    

                    BtnAceptar.Visible = true;
                    BtnCancelar.Visible = true;
                    BtnCerrar.Visible = false;
                    TxtNombreUsuario.Enabled = false;

                    ModalPopupExtenderDetalleUsuario.Show();
                    UpdatePanelDetalleUsuarios.Update();
                    break;
                case "Desactivar":
                    indiceFila = Convert.ToInt32( e.CommandArgument );

                    usuario = new Usuario();
                    usuario.Id = Convert.ToInt64( GrdUsuarios.DataKeys[indiceFila].Values["Id"] );

                    try
                    {
                        Usuario usuarioBaja = (Usuario)Session["AdmnUsuarios.Usuario"];
                        gUsuario.Eliminar( usuario, usuarioBaja );
                    }
                    catch (Exception ex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo eliminar el usuario. " + ex.Message );
                        return;
                    }

                    BtnBuscar_Click( null, null );
                    this.RegistrarMensajeJavascript( "Mensaje", "El usuario se elimino exitosamente" );

                    break;
                case "Desbloquear":
                    indiceFila = Convert.ToInt32( e.CommandArgument );

                    usuario = new Usuario();
                    usuario.Id = Convert.ToInt64( GrdUsuarios.DataKeys[indiceFila].Values["Id"] );

                    try
                    {
                        gUsuario.Desbloquear( usuario );
                    }
                    catch (Exception ex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo desbloquear el usuario. " + ex.Message );
                        return;
                    }

                    BtnBuscar_Click( null, null );
                    this.RegistrarMensajeJavascript( "Mensaje", "El usuario se desbloqueo exitosamente" );

                    break;
                case "RestablecerClave":
                    indiceFila = Convert.ToInt32( e.CommandArgument );

                    usuario = new Usuario();
                    usuario.Id = Convert.ToInt64( GrdUsuarios.DataKeys[indiceFila].Values["Id"] );

                    try
                    {
                        gUsuario.ReestablecerContraseña( usuario );
                    }
                    catch (Exception ex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo reestabler la clave del usuario. " + ex.Message );
                        return;
                    }

                    BtnBuscar_Click( null, null );
                    this.RegistrarMensajeJavascript( "Mensaje", "La clave del usuario se reestablecio exitosamente" );

                    break;
                case "Activar":
                    indiceFila = Convert.ToInt32( e.CommandArgument );

                    usuario = new Usuario();
                    usuario.Id = Convert.ToInt64( GrdUsuarios.DataKeys[indiceFila].Values["Id"] );

                    try
                    {
                        gUsuario.Activar( usuario );
                    }
                    catch (Exception ex)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo activar usuario. " + ex.Message );
                        return;
                    }

                    BtnBuscar_Click( null, null );
                    this.RegistrarMensajeJavascript( "Mensaje", "El usuario se reactivó exitosamente" );
                    break;

            }
        }

        protected void BtnBuscar_Click ( object sender, ImageClickEventArgs e )
        {
            string buscarNombreUsuario = null;
            string buscarDescripcionUsuario = null;

            if (!string.IsNullOrEmpty( TxtBuscarNombreUsuario.Text.Trim() )) buscarNombreUsuario = TxtBuscarNombreUsuario.Text.Trim();
            if (!string.IsNullOrEmpty( TxtBuscarDescripcion.Text.Trim() )) buscarDescripcionUsuario = TxtBuscarDescripcion.Text.Trim();

            if (string.IsNullOrEmpty( TxtBuscarNombreUsuario.Text.Trim() ) &&
                string.IsNullOrEmpty( TxtBuscarDescripcion.Text.Trim() ))
                

            try
            {
                this.Buscar( buscarNombreUsuario, buscarDescripcionUsuario, !ChkBuscarInactivos.Checked, 0 );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo realizar la búsqueda de Usuarios. " + ex.Message );
            }

            UpdatePanelListado.Update();
        }

        protected void GrdUsuarios_RowCreated ( object sender, GridViewRowEventArgs e )
        {
            LinkButton lnkButton;

            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                lnkButton = (LinkButton)e.Row.Cells[7].Controls[0];
                lnkButton.Attributes.Add( "onclick", "return confirm('Esta seguro que desea desbloquear este usuario?')" );

                lnkButton = (LinkButton)e.Row.Cells[8].Controls[0];
                lnkButton.Attributes.Add( "onclick", "return confirm('Esta seguro que desea establecer la clave por defecto para este usuario?')" );
            }
        }

        protected void GrdUsuarios_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            LinkButton lnkButtonActDes;

            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                lnkButtonActDes = (LinkButton)e.Row.Cells[6].Controls[0];

                //La fechaBaja es nula?
                if (DateTime.Parse( e.Row.Cells[3].Text ) == DateTime.MinValue)
                {
                    lnkButtonActDes.Text = "Desactivar";
                    lnkButtonActDes.CommandName = "Desactivar";
                    lnkButtonActDes.Attributes.Add( "onclick", "return confirm('Esta seguro que desea desactivar este usuario?')" );
                }
                else
                {
                    lnkButtonActDes.Text = "Activar";
                    lnkButtonActDes.CommandName = "Activar";

                    //Ocultamos las columnas asociadas a operaciones con los datos del usuario
                    e.Row.Cells[4].Visible = false;
                    e.Row.Cells[5].Visible = false;
                    e.Row.Cells[7].Visible = false;
                    e.Row.Cells[8].Visible = false;
                }

                //Ocultamos la columna de fecha de baja
                e.Row.Cells[3].Visible = false;
            }
        }

        protected void BtnAceptar_Click ( object sender, ImageClickEventArgs e )
        {
            if (!Page.IsValid) return;

            string errores;
            if (!Validar( out errores ))
            {
                this.RegistrarMensajeJavascript( "Error", "Algunos datos no son validos. " + errores );
                return;
            }

            Usuario usuario = new Usuario();
                       
            usuario.NombreUsuario = TxtNombreUsuario.Text.Trim();
            usuario.Descripcion = TxtDescripcion.Text.Trim();

            if (!string.IsNullOrEmpty( TxtCorreoElectronico.Text.Trim() )) usuario.CorreoElectronico = TxtCorreoElectronico.Text.Trim();

            usuario.Sector = new Sector();
            usuario.Sector.Id = Convert.ToInt64( DdlSector.SelectedValue );
            
            if (Session["AdmnUsuarios.Usuario"] != null) usuario.UsuarioAlta = (Usuario)Session["AdmnUsuarios.Usuario"];

            usuario.Contraseña = TxtContraseña.Text;

            try
            {
                GestorUsuario gUsuario = new GestorUsuario();

                if (usuario.Id == 0) gUsuario.Registrar( usuario );
                else gUsuario.Modificar( usuario );
            }
            catch (BusinessException bex)
            {
                this.RegistrarMensajeJavascript( "Error", bex.Message );
                return;
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "Error inesperado al registrar el usuario. " + ex.Message );
                return;
            }

            ModalPopupExtenderDetalleUsuario.Hide();
            BtnBuscar_Click( null, null );

            this.RegistrarMensajeJavascript( "Mensaje", "Los datos del usuario se registraron exitosamente" );
        }

        protected void GrdUsuarios_Sorting ( object sender, GridViewSortEventArgs e )
        {
            Session["ABMUsuarios.Listado.OrdenarExpresion"] = e.SortExpression;
            Session["ABMUsuarios.Listado.OrdenarDireccion"] = e.SortDirection;

            this.BtnBuscar_Click( null, null );
        }
    }
}